自定义中间件

概述

在 Django 中,中间件是一个轻量级的插件系统,它可以在请求和响应的生命周期中执行特定的操作。中间件可以用于处理请求前的预处理、响应后的后处理,或者在请求和响应之间执行某些逻辑。Django 自带了一些中间件,但你也可以编写自定义中间件来满足特定的需求。

中间件的工作原理

Django 的中间件是一个 Python 类,它定义了几个方法,这些方法在请求和响应的不同阶段被调用。以下是中间件的主要方法:

  • __init__(self): 初始化中间件。
  • process_request(self, request): 在请求到达视图之前调用。
  • process_view(self, request, view_func, view_args, view_kwargs): 在视图函数被调用之前调用。
  • process_template_response(self, request, response): 在视图函数返回一个 TemplateResponse 对象时调用。
  • process_response(self, request, response): 在响应返回给客户端之前调用。
  • process_exception(self, request, exception): 在视图函数抛出异常时调用。

创建自定义中间件

1. 创建中间件类

首先,我们需要创建一个中间件类。这个类可以放在项目的任何地方,但通常我们会将其放在 middleware.py 文件中。

# middleware.py

class CustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # 初始化代码

    def __call__(self, request):
        # 在请求处理之前的代码
        print("CustomMiddleware: Before request")

        response = self.get_response(request)

        # 在响应返回之前的代码
        print("CustomMiddleware: After response")

        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        # 在视图函数被调用之前执行的代码
        print(f"CustomMiddleware: Processing view {view_func.__name__}")

    def process_exception(self, request, exception):
        # 在视图函数抛出异常时执行的代码
        print(f"CustomMiddleware: Exception occurred - {exception}")

    def process_template_response(self, request, response):
        # 在视图函数返回一个 TemplateResponse 对象时执行的代码
        print("CustomMiddleware: Processing template response")
        return response

2. 注册中间件

接下来,我们需要在 Django 项目的 settings.py 文件中注册这个中间件。

# settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'path.to.middleware.CustomMiddleware',  # 添加自定义中间件
]

3. 测试中间件

现在,我们可以启动 Django 开发服务器,并访问任何视图来测试我们的中间件。

python manage.py runserver

当你访问一个视图时,你应该会在控制台看到中间件输出的日志信息。

实践练习

练习1:记录请求时间

编写一个中间件,记录每个请求的处理时间,并在响应返回时输出这个时间。

import time

class RequestTimeMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        start_time = time.time()

        response = self.get_response(request)

        end_time = time.time()
        print(f"Request took {end_time - start_time} seconds")

        return response

练习2:限制请求频率

编写一个中间件,限制用户在一定时间内对某个视图的请求频率。例如,限制用户每分钟只能访问某个视图一次。

from django.core.cache import cache

class RateLimitMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        user_ip = request.META.get('REMOTE_ADDR')
        cache_key = f'rate_limit_{user_ip}'

        if cache.get(cache_key):
            return HttpResponse("Too many requests", status=429)

        cache.set(cache_key, True, 60)  # 缓存1分钟

        response = self.get_response(request)
        return response

总结

自定义中间件是 Django 中一个非常强大的功能,它允许你在请求和响应的生命周期中插入自定义逻辑。通过编写和注册中间件,你可以实现诸如请求时间记录、请求频率限制等功能。希望这篇教程能帮助你理解如何创建和使用自定义中间件。